import Vue from 'vue'
import App from './App.vue'
import router from './router'
import './plugins/element.js'
import './assets/css/global.css'
import axios from 'axios'
import Message from 'element-ui/packages/message/src/main'

import ZkTable from 'vue-table-with-tree-grid'

import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 关闭转圈动画
NProgress.configure({ showSpinner: false })

Vue.use(ZkTable)

Vue.config.productionTip = false

// axios 提交设置成 form-data 提交
// 这个套路是我在 https://www.jianshu.com/p/b10454ed38ba 上看到的
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
axios.defaults.headers.get['Content-Type'] = 'application/x-www-form-urlencoded'
axios.defaults.transformRequest = [function (data) {
  let ret = ''
  for (let it in data) {
    ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
  }
  return ret
}]

// 默认请求地址
axios.defaults.baseURL = 'http://localhost:8080/'
Vue.prototype.$axios = axios

axios.interceptors.request.use(
  config => {
    NProgress.start()
    // console.log('' + config.url)
    const requestUrl = config.url
    // 改写请求地址，请求 url 保证 /api 开头
    if (!requestUrl.startsWith('/api') && !requestUrl.startsWith('api')) {
      if (requestUrl.startsWith('/')) {
        config.url = config.url = '/api' + config.url
      } else {
        config.url = config.url = '/api/' + config.url
      }
    }
    return config
  }
)
// http response 拦截器
axios.interceptors.response.use(
  response => {
    NProgress.done()
    // console.log('interceptors.response: ' + JSON.stringify(response))
    // 后台未挂，成功返回响应
    let code = response.data.code
    // console.log('response.data.code: ' + JSON.stringify(code))
    // 后台未返回正确响应
    if (code !== 1) {
      // 未登录，跳转登录页
      if (code === 2) {
        Message({ message: response.data.msg, type: 'error' })
        router.push('/login')
      } else {
        // 其他错误，弹窗提示
        Message({
          message: response.data.msg,
          type: 'error'
        })
        return Promise.reject(response.data.msg)
      }
    }
    return response
  }, error => {
    // console.log('error: ' + error)
    // console.log('error.response: ' + JSON.stringify(error.response))
    // console.log('error.response.data: ' + JSON.stringify(error.response.data))
    if ((error.response.data + '').indexOf('ECONNREFUSED') !== -1) {
      // 未登录的，强制跳转登录页
      if (!window.sessionStorage.getItem('realName')) {
        Message({ message: '对不起，您未登录', type: 'error' })
        router.push('/login')
      }
      // 提示
      Message({
        message: '哎呀，后台挂了，请联系管理员',
        type: 'error'
      })
    } else {
      let code = error.response.status
      // TODO 这一步提示错误，记得不要把前端崩了。——2020年1月15日 舒瑶琴指导
      if (code === 404) {
        // router.push('/500')
        Message({ message: '404', type: 'error' })
        // router.replace({
        //   path: '/404'
        //   // 登录成功后跳入浏览的当前页面
        //   // query: {redirect: router.currentRoute.fullPath}
        // })
      }
      return Promise.reject(error.response.data)
    }
  }
)

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')
